using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._MosaicDataset
{
    /// <summary>
    /// <para>Create Referenced Mosaic Dataset</para>
    /// <para>Creates a separate mosaic dataset from items in an existing mosaic dataset.</para>
    /// <para>从现有镶嵌数据集中的项目创建单独的镶嵌数据集。</para>
    /// </summary>    
    [DisplayName("Create Referenced Mosaic Dataset")]
    public class CreateReferencedMosaicDataset : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreateReferencedMosaicDataset()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_dataset">
        /// <para>Mosaic Dataset</para>
        /// <para>The mosaic dataset from which items will be selected.</para>
        /// <para>将从中选择项目的镶嵌数据集。</para>
        /// </param>
        /// <param name="_out_mosaic_dataset">
        /// <para>Output Mosaic Dataset</para>
        /// <para>The referenced mosaic dataset to be created.</para>
        /// <para>要创建的引用镶嵌数据集。</para>
        /// </param>
        public CreateReferencedMosaicDataset(object _in_dataset, object _out_mosaic_dataset)
        {
            this._in_dataset = _in_dataset;
            this._out_mosaic_dataset = _out_mosaic_dataset;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Create Referenced Mosaic Dataset";

        public override string CallName => "management.CreateReferencedMosaicDataset";

        public override List<string> AcceptEnvironments => ["configKeyword", "extent", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_dataset, _out_mosaic_dataset, _coordinate_system, _number_of_bands, _pixel_type.GetGPValue(), _where_clause, _in_template_dataset, _extent, _select_using_features.GetGPValue(), _lod_field, _minPS_field, _maxPS_field, _pixelSize, _build_boundary.GetGPValue()];

        /// <summary>
        /// <para>Mosaic Dataset</para>
        /// <para>The mosaic dataset from which items will be selected.</para>
        /// <para>将从中选择项目的镶嵌数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Mosaic Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_dataset { get; set; }


        /// <summary>
        /// <para>Output Mosaic Dataset</para>
        /// <para>The referenced mosaic dataset to be created.</para>
        /// <para>要创建的引用镶嵌数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Mosaic Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_mosaic_dataset { get; set; }


        /// <summary>
        /// <para>Coordinate System</para>
        /// <para>The projection for the output mosaic dataset.</para>
        /// <para>输出镶嵌数据集的投影。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _coordinate_system { get; set; } = null;


        /// <summary>
        /// <para>Number of Bands</para>
        /// <para>The number of bands that the referenced mosaic dataset will have.</para>
        /// <para>引用镶嵌数据集将具有的波段数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Number of Bands")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long? _number_of_bands { get; set; } = null;


        /// <summary>
        /// <para>Pixel Type</para>
        /// <para><xdoc>
        ///   <para>The bit depth, or radiometric resolution, of the mosaic dataset. If this is not defined, it will be taken from the first raster dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>1-bit—A 1-bit unsigned integer. The values can be 0 or 1.</bullet_item><para/>
        ///     <bullet_item>2-bit—A 2-bit unsigned integer. The values supported can be from 0 to 3.</bullet_item><para/>
        ///     <bullet_item>4-bit—A 4-bit unsigned integer. The values supported can be from 0 to 15.</bullet_item><para/>
        ///     <bullet_item>8-bit unsigned—An unsigned 8-bit data type. The values supported can be from 0 to 255.</bullet_item><para/>
        ///     <bullet_item>8-bit signed—A signed 8-bit data type. The values supported can be from -128 to 127.</bullet_item><para/>
        ///     <bullet_item>16-bit unsigned—A 16-bit unsigned data type. The values can range from 0 to 65,535.</bullet_item><para/>
        ///     <bullet_item>16-bit signed—A 16-bit signed data type. The values can range from -32,768 to 32,767.</bullet_item><para/>
        ///     <bullet_item>32-bit unsigned—A 32-bit unsigned data type. The values can range from 0 to 4,294,967,295.</bullet_item><para/>
        ///     <bullet_item>32-bit signed—A 32-bit signed data type. The values can range from -2,147,483,648 to 2,147,483,647.</bullet_item><para/>
        ///     <bullet_item>32-bit floating point—A 32-bit data type supporting decimals.</bullet_item><para/>
        ///     <bullet_item>64-bit—A 64-bit data type supporting decimals.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>镶嵌数据集的位深度或辐射分辨率。如果未定义，则将从第一个栅格数据集中获取该参数。</para>
        ///   <bulletList>
        ///     <bullet_item>1 位 - 1 位无符号整数。这些值可以是 0 或 1。</bullet_item><para/>
        ///     <bullet_item>2 位 - 2 位无符号整数。支持的值可以是 0 到 3。</bullet_item><para/>
        ///     <bullet_item>4 位 - 4 位无符号整数。支持的值可以介于 0 到 15 之间。</bullet_item><para/>
        ///     <bullet_item>8 位无符号 - 无符号的 8 位数据类型。支持的值可以介于 0 到 255 之间。</bullet_item><para/>
        ///     <bullet_item>8 位签名 - 带签名的 8 位数据类型。支持的值可以介于 -128 到 127 之间。</bullet_item><para/>
        ///     <bullet_item>16 位无符号 - 16 位无符号数据类型。这些值的范围可以从 0 到 65,535。</bullet_item><para/>
        ///     <bullet_item>16 位有符号 - 16 位有符号数据类型。这些值的范围可以从 -32,768 到 32,767。</bullet_item><para/>
        ///     <bullet_item>32 位无符号 - 32 位无符号数据类型。这些值的范围可以从 0 到 4,294,967,295。</bullet_item><para/>
        ///     <bullet_item>32 位有符号 - 32 位有符号数据类型。这些值的范围可以从 -2,147,483,648 到 2,147,483,647。</bullet_item><para/>
        ///     <bullet_item>32 位浮点 - 支持小数的 32 位数据类型。</bullet_item><para/>
        ///     <bullet_item>64 位 - 支持小数的 64 位数据类型。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Pixel Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _pixel_type_value? _pixel_type { get; set; } = null;

        public enum _pixel_type_value
        {
            /// <summary>
            /// <para>1-bit</para>
            /// <para>1-bit—A 1-bit unsigned integer. The values can be 0 or 1.</para>
            /// <para>1 位 - 1 位无符号整数。这些值可以是 0 或 1。</para>
            /// </summary>
            [Description("1-bit")]
            [GPEnumValue("1_BIT")]
            _1_BIT,

            /// <summary>
            /// <para>2-bit</para>
            /// <para>2-bit—A 2-bit unsigned integer. The values supported can be from 0 to 3.</para>
            /// <para>2 位 - 2 位无符号整数。支持的值可以是 0 到 3。</para>
            /// </summary>
            [Description("2-bit")]
            [GPEnumValue("2_BIT")]
            _2_BIT,

            /// <summary>
            /// <para>4-bit</para>
            /// <para>4-bit—A 4-bit unsigned integer. The values supported can be from 0 to 15.</para>
            /// <para>4 位 - 4 位无符号整数。支持的值可以介于 0 到 15 之间。</para>
            /// </summary>
            [Description("4-bit")]
            [GPEnumValue("4_BIT")]
            _4_BIT,

            /// <summary>
            /// <para>8-bit unsigned</para>
            /// <para>8-bit unsigned—An unsigned 8-bit data type. The values supported can be from 0 to 255.</para>
            /// <para>8 位无符号 - 无符号的 8 位数据类型。支持的值可以介于 0 到 255 之间。</para>
            /// </summary>
            [Description("8-bit unsigned")]
            [GPEnumValue("8_BIT_UNSIGNED")]
            _8_BIT_UNSIGNED,

            /// <summary>
            /// <para>8-bit signed</para>
            /// <para>8-bit signed—A signed 8-bit data type. The values supported can be from -128 to 127.</para>
            /// <para>8 位签名 - 带签名的 8 位数据类型。支持的值可以介于 -128 到 127 之间。</para>
            /// </summary>
            [Description("8-bit signed")]
            [GPEnumValue("8_BIT_SIGNED")]
            _8_BIT_SIGNED,

            /// <summary>
            /// <para>16-bit unsigned</para>
            /// <para>16-bit unsigned—A 16-bit unsigned data type. The values can range from 0 to 65,535.</para>
            /// <para>16 位无符号 - 16 位无符号数据类型。这些值的范围可以从 0 到 65,535。</para>
            /// </summary>
            [Description("16-bit unsigned")]
            [GPEnumValue("16_BIT_UNSIGNED")]
            _16_BIT_UNSIGNED,

            /// <summary>
            /// <para>16-bit signed</para>
            /// <para>16-bit signed—A 16-bit signed data type. The values can range from -32,768 to 32,767.</para>
            /// <para>16 位有符号 - 16 位有符号数据类型。这些值的范围可以从 -32,768 到 32,767。</para>
            /// </summary>
            [Description("16-bit signed")]
            [GPEnumValue("16_BIT_SIGNED")]
            _16_BIT_SIGNED,

            /// <summary>
            /// <para>32-bit unsigned</para>
            /// <para>32-bit unsigned—A 32-bit unsigned data type. The values can range from 0 to 4,294,967,295.</para>
            /// <para>32 位无符号 - 32 位无符号数据类型。这些值的范围可以从 0 到 4,294,967,295。</para>
            /// </summary>
            [Description("32-bit unsigned")]
            [GPEnumValue("32_BIT_UNSIGNED")]
            _32_BIT_UNSIGNED,

            /// <summary>
            /// <para>32-bit signed</para>
            /// <para>32-bit signed—A 32-bit signed data type. The values can range from -2,147,483,648 to 2,147,483,647.</para>
            /// <para>32 位有符号 - 32 位有符号数据类型。这些值的范围可以从 -2,147,483,648 到 2,147,483,647。</para>
            /// </summary>
            [Description("32-bit signed")]
            [GPEnumValue("32_BIT_SIGNED")]
            _32_BIT_SIGNED,

            /// <summary>
            /// <para>32-bit floating point</para>
            /// <para>32-bit floating point—A 32-bit data type supporting decimals.</para>
            /// <para>32 位浮点 - 支持小数的 32 位数据类型。</para>
            /// </summary>
            [Description("32-bit floating point")]
            [GPEnumValue("32_BIT_FLOAT")]
            _32_BIT_FLOAT,

            /// <summary>
            /// <para>64-bit</para>
            /// <para>64-bit—A 64-bit data type supporting decimals.</para>
            /// <para>64 位 - 支持小数的 64 位数据类型。</para>
            /// </summary>
            [Description("64-bit")]
            [GPEnumValue("64_BIT")]
            _64_BIT,

        }

        /// <summary>
        /// <para>Query Definition</para>
        /// <para>An SQL expression to select raster datasets that will be included in the output mosaic dataset.</para>
        /// <para>一个 SQL 表达式，用于选择将包含在输出镶嵌数据集中的栅格数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Query Definition")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _where_clause { get; set; } = null;


        /// <summary>
        /// <para>Extent from Dataset</para>
        /// <para>Select raster datasets based on the extent of another image or feature class. Raster datasets that lay along the defined extent will be included in the mosaic dataset. To manually input the minimum and maximum coordinates for the extent, use the Extent parameter.</para>
        /// <para>根据其他影像或要素类的范围选择栅格数据集。沿定义范围放置的栅格数据集将包含在镶嵌数据集中。要手动输入范围的最小和最大坐标，请使用范围参数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Extent from Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_template_dataset { get; set; } = null;


        /// <summary>
        /// <para>Extent</para>
        /// <para>The minimum and maximum coordinates for the extent. If a dataset is selected in Extent from Dataset, those coordinates will automatically appear here.</para>
        /// <para>范围的最小和最大坐标。如果在数据集范围中选择了数据集，则这些坐标将自动显示在此处。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Extent")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _extent { get; set; } = null;


        /// <summary>
        /// <para>Using Input Geometry for Selection</para>
        /// <para><xdoc>
        ///   <para>Limit the extent to the shape or envelope when a feature class is selected in the Extent from Dataset parameter.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Select based on the shape of the feature. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Select based on the extent of the feature class.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>在数据集范围参数中选择要素类时，将范围限制为形状或包络。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 （Checked） - 根据特征的形状进行选取。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 根据要素类的范围进行选择。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Using Input Geometry for Selection")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _select_using_features_value _select_using_features { get; set; } = _select_using_features_value._true;

        public enum _select_using_features_value
        {
            /// <summary>
            /// <para>SELECT_USING_FEATURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("SELECT_USING_FEATURES")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_SELECT_USING_FEATURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_SELECT_USING_FEATURES")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Scale Field</para>
        /// <para>This parameter has been deprecated and is ignored in tool execution. It remains for backward compatibility reasons.</para>
        /// <para>此参数已弃用，在工具执行中将被忽略。出于向后兼容性的原因，它仍然存在。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Scale Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _lod_field { get; set; } = null;


        /// <summary>
        /// <para>Minimum Cell Size Field</para>
        /// <para>Specify a field from the footprint attribute table that defines the minimum cell size for displaying the mosaic dataset; otherwise, only a footprint will be displayed.</para>
        /// <para>从封装属性表中指定一个字段，用于定义用于显示镶嵌数据集的最小像元大小;否则，将仅显示封装。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum Cell Size Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _minPS_field { get; set; } = null;


        /// <summary>
        /// <para>Maximum Cell Size Field</para>
        /// <para>Specify a field from the footprint attribute table that defines the maximum cell size for displaying the mosaic dataset; otherwise, only a footprint will be displayed.</para>
        /// <para>从封装属性表中指定一个字段，用于定义用于显示镶嵌数据集的最大像元大小;否则，将仅显示封装。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum Cell Size Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _maxPS_field { get; set; } = null;


        /// <summary>
        /// <para>Maximum Visible Cell Size</para>
        /// <para>Set a maximum cell size to display the mosaic instead of specifying a field. If you zoom out beyond this cell size, only the footprint will be displayed.</para>
        /// <para>设置最大单元格大小以显示镶嵌，而不是指定字段。如果缩小到超出此单元格大小，则仅显示封装。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum Visible Cell Size")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _pixelSize { get; set; } = null;


        /// <summary>
        /// <para>Build Boundary</para>
        /// <para><xdoc>
        ///   <para>Rebuild the boundary. If the selection covers a smaller area than the source mosaic dataset, this is recommended.</para>
        ///   <para>This is only available if the mosaic dataset is created in a geodatabase.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Generate the boundary. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Do not generate the boundary.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>重建边界。如果所选内容覆盖的区域小于源镶嵌数据集，则建议这样做。</para>
        ///   <para>仅当在地理数据库中创建镶嵌数据集时，此功能才可用。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 （Checked） - 生成边界。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 （Unchecked） - 不生成边界。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Build Boundary")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _build_boundary_value _build_boundary { get; set; } = _build_boundary_value._true;

        public enum _build_boundary_value
        {
            /// <summary>
            /// <para>BUILD_BOUNDARY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("BUILD_BOUNDARY")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_BOUNDARY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_BOUNDARY")]
            [GPEnumValue("false")]
            _false,

        }

        public CreateReferencedMosaicDataset SetEnv(object configKeyword = null, object extent = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(configKeyword: configKeyword, extent: extent, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}